/*
* ==========================================底层数据层==========================================
* ===================================配件信息、仓库、日志数据块===================================
* 1. 配件信息类：包含配件的编号、名称、型号、价格、位置、库存数量、库存上限、库存下限
* 2. 仓库记录基类：包含仓库记录的编号、配件编号、操作时间、操作状态
* 3. 仓库入库信息记录类：派生自仓库记录基类，增加入库数量
* 4. 仓库出库信息记录类：派生自仓库记录基类，增加出库数量
* 5. 仓库异常信息记录类：包含异常编号、配件编号、实际数量、系统数量、差异描述、确认状态
* 6. 日志记录类：包含日志编号、操作时间、操作人角色编号、操作描述
* ===================================配件信息、仓库、日志数据块===================================
* ==========================================底层数据层==========================================
*/


#ifndef PARTSTORE_H
#define PARTSTORE_H

#include <QDateTime>
#include "User.h"


typedef QDateTime myTime_t;


/*============================================<配件类实现>============================================*/

class Part//配件类
{
private:
    int id;                     //配件编号
    QString name;           //配件名称
    QString model;          //配件型号
    double price;               //配件价格
    QString location;       //配件位置
    int stockQuantity;          //库存数量
    int stockUpperLimit;        //库存上限
    int stockLowerLimit;        //库存下限

public:
    Part() = default;
    Part(int id, QString name, QString model, double price, QString location, int stockQuantity, int stockUpperLimit, int stockLowerLimit);
    Part(QString name, QString model, double price, QString location, int stockQuantity, int stockUpperLimit, int stockLowerLimit);
    ~Part();

    int getId()const;
    QString getName()const;
    QString getModel()const;
    double getPrice()const;
    QString getLocation()const;
    int getStockQuantity()const;
    int getStockUpperLimit()const;
    int getStockLowerLimit()const;

    void setLocation(QString location);
    void setStockQuantity(int quantity);
};

/*============================================<仓库记录类实现>============================================*/

class StoreRecord//仓库记录基类
{
private:
    int recordId;               //记录编号
    int partId;                 //配件编号
    myTime_t operationTime;     //操作时间
    QString status;         //操作状态

public:
    StoreRecord() = default;
    StoreRecord(const int& recordId, const int& partId,const myTime_t& operationTime,const QString& status);
    StoreRecord(const int& partId,const myTime_t& operationTime,const QString& status);
    ~StoreRecord();

    int getrecordId()const;
    int getPartId()const;
    myTime_t getOperationTime()const;
    QString getStatus()const;
};

/*===============<仓库入库记录类实现>===============*/
class StoreInRecord:public StoreRecord//仓库入库记录
{
private:
    int inQuantity;
public:
    StoreInRecord() = default;
    StoreInRecord(const int& recordId, const int& partId, const myTime_t& operationTime, const QString& status, const int& inQuantity);
    StoreInRecord(const StoreRecord& sr, const int& inQuantity);
    StoreInRecord(const int& partId, const myTime_t& operationTime, const QString& status, const int& inQuantity);
    ~StoreInRecord();

    int getInQuantity()const;
};

/*===============<仓库出库记录类实现>===============*/
class StoreOutRecord:public StoreRecord//仓库出库记录
{
private:
    int outQuantity;
public:
    StoreOutRecord() = default;
    StoreOutRecord(const StoreRecord& sr, const int& outQuantity);
    StoreOutRecord(const int& recordId, const int& partId, const myTime_t& operationTime, const QString& status, const int& outQuantity);
    StoreOutRecord(const int& partId, const myTime_t& operationTime, const QString& status, const int& outQuantity);
    ~StoreOutRecord();

    int getOutQuantity()const;
};

/*============================================<仓库异常库记录类实现>============================================*/
class StoreAnomaly//仓库异常
{
private:
    int anomalyId;              //异常编号
    int partId;                 //配件编号
    QString location;       //配件位置
    int actualQuantity;         //实际数量    
    int systemQuantity;         //系统数量    
    QString difference;     //差异描述
    QString confirmStatus;  //确认状态
    
public:
    StoreAnomaly() = default;
    StoreAnomaly(const int& anomalyId, const int& partId, const int& actualQuantity, const int& systemQuantity, const QString& difference, const QString& confirmStatus);
    StoreAnomaly(const int& anomalyId, const int& partId,const QString& location ,const int& actualQuantity, const int& systemQuantity, const QString& difference, const QString& confirmStatus);
    ~StoreAnomaly();

    int getAnomalyId()const;
    int getPartId()const;
    QString getLocation()const;
    int getActualQuantity()const;
    int getSystemQuantity()const;
    QString getDifference()const;
    QString getConfirmStatus()const;

    void setAnomalyId(int anomalyId);
    void setDifference(QString difference);
    void setConfirmStatus(QString confirmStatus);
};

/*============================================<日志类实现>============================================*/
class LogEntry//日志记录
{
private:
    int logId;                      //日志编号
    myTime_t operationTime;         //操作时间
    QString operatorName;   //操作人姓名
    Role operatorRole;              //操作人角色
    QString operationDescribe;  //操作描述

public:
    LogEntry() = default;
    LogEntry(const myTime_t& operationTime, const QString& operatorName, const Role& operatorRole, const QString& operationDescribe);
    ~LogEntry();

    int getLogId()const;
    myTime_t getOperationTime()const;
    QString getOperatorName()const;
    Role getOperatorRole()const;
    QString getOperationDescribe()const;
};

#endif
